// stores/modules/user.js - 用户模块状态管理
import {
	defineStore
} from 'pinia'
import api from '@/api/modules'
import {
	token,
	storage,
	message
} from '@/utils'

export const useUserStore = defineStore('user', {
	state: () => ({
		userInfo: null,
		isLogin: false,
		isGuestMode: false, // 新增：游客模式标志
		vipInfo: null,
		lastRefreshTime: 0, // 最后一次刷新用户信息的时间戳
		tokenUsage: null // 用户token使用情况
	}),

	getters: {
		getUser: (state) => state.userInfo,
		getIsLogin: (state) => state.isLogin,
		getIsGuest: (state) => state.isGuestMode, // 新增：游客状态getter
		getVipInfo: (state) => state.vipInfo,
		isVip: (state) => state.userInfo?.vipStatus === 1,
		getNickname: (state) => state.userInfo?.nickname || '游客用户', // 修改默认名称
		getAvatar: (state) => state.userInfo?.avatar || '/static/images/default-avatar.png',
		getTokenUsage: (state) => state.tokenUsage,
		// 添加userId的getter，直接从userInfo中获取，如果没有则从storage获取
		userId: (state) => state.userInfo?.id || storage.getItem('userId'),
		// 新增：判断用户是否可以访问某个功能
		canUseFeature: (state) => (featureName) => {
			// 已登录用户可以使用所有功能
			if (state.isLogin) return true
			
			// 游客模式下的功能限制列表
			const guestRestrictedFeatures = [
				'premium_chat', // 高级对话
				'export',       // 导出功能
				'custom_prompt', // 自定义提示词
				'history_save'  // 保存历史记录
				// 可以根据需要添加更多限制功能
			]
			
			// 如果是游客模式且功能在限制列表中，则返回false
			if (state.isGuestMode && guestRestrictedFeatures.includes(featureName)) {
				return false
			}
			
			return true
		}
	},

	actions: {
		// 设置登录状态
		setLoginState(isLogin) {
			this.isLogin = isLogin
			if (isLogin) {
				this.isGuestMode = false
				storage.setItem('isGuestMode', false)
			}
		},

		// 设置用户信息
		setUserInfo(userInfo) {
			this.userInfo = userInfo
			if (userInfo) {
				storage.setItem('userInfo', userInfo)
				storage.setItem('userId', userInfo.id)
				this.isLogin = true
				this.isGuestMode = false
				storage.setItem('isGuestMode', false)
			} else {
				storage.removeItem('userInfo')
				storage.removeItem('userId')
				this.isLogin = false
			}
		},

		// 设置游客模式 - 使用共享游客账号
		// 设置游客模式 - 使用共享游客账号
		setGuestMode() {
		  this.isGuestMode = true;
		  this.isLogin = false;
		  this.userInfo = {
		    id: 12,
		    uuid: '1234567890',
		    username: 'guest',
		    nickname: '游客用户',
		    avatar: '/static/images/default-avatar.png',
		    isGuest: true,
		    total_tokens_balance: 5000
		  };
		  
		  // 设置游客账号的访问令牌（预设的共享游客账号令牌）
		  // 这个令牌应该是后端为游客账号专门生成的长期有效令牌
		  const guestToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJndWVzdF91c2VyIiwiaWF0IjoxNjgyNTAxMjM0LCJleHAiOjE5OTc4NjEyMzQsInJvbGUiOiJndWVzdCJ9.q8s_PiXJJ-Q3FTLVYHJwpXQN-Z9zJDK9fS2EXVfPrYw';
		  const guestRefreshToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJndWVzdF91c2VyX3JlZnJlc2giLCJpYXQiOjE2ODI1MDEyMzQsImV4cCI6MTk5Nzg2MTIzNCwicm9sZSI6Imd1ZXN0In0.Ij0rVwGXw5RW8Eih9Qfp1m5i5Z1ZBwSLxUYJZRYSYjQ';
		  
		  // 设置游客令牌
		  token.setToken(guestToken);
		  token.setRefreshToken(guestRefreshToken);
		  
		  // 设置游客用户ID
		  storage.setItem('userId', '12'); // 更新为正确的游客ID
		  storage.removeItem('userInfo');
		  
		  // 保存游客模式状态
		  storage.setItem('isGuestMode', true);
		  storage.setItem('guestUserInfo', this.userInfo);
		  
		  console.log('已切换到游客模式，使用ID=12的游客账号');
		},

		// 新增：初始化用户状态（从存储中恢复）
		initUserState() {
			const isGuestMode = storage.getItem('isGuestMode')
			
			if (isGuestMode) {
				// 恢复游客模式
				this.isGuestMode = true
				this.isLogin = false
				this.userInfo = storage.getItem('guestUserInfo') || {
					nickname: '游客用户',
					avatar: '/static/images/default-avatar.png'
				}
				return
			}
			
			// 常规登录状态恢复
			this.checkLoginStatus()
		},

		// 账号密码登录
		async login(username, password) {
			try {
				const res = await api.auth.login({
					username,
					password
				})
				this.handleLoginSuccess(res)
				return res
			} catch (error) {
				throw error
			}
		},

		// 手机号验证码登录
		async phoneLogin(phoneNumber, code) {
			try {
				const ip = ''
				const res = await api.auth.phoneLogin({
					phoneNumber,
					code,
					ip
				})
				this.handleLoginSuccess(res)
				return res
			} catch (error) {
				throw error
			}
		},

		// 微信小程序登录
		async wxLogin(data) {
			try {
				const res = await api.auth.wxLogin(data)
				this.handleLoginSuccess(res)
				return res
			} catch (error) {
				throw error
			}
		},

		// 导出handleLoginSuccess方法，以便其他工具类也能使用
		exportHandleLoginSuccess(res) {
			// 复用已有的handleLoginSuccess逻辑
			this.handleLoginSuccess(res);
			return true; // 返回成功标志
		},

		// 处理登录成功逻辑
		handleLoginSuccess(res) {
			if (res.data) {
				const {
					token: accessToken,
					refreshToken,
					userId,
					...userInfo
				} = res.data

				// 保存令牌
				token.setToken(accessToken)
				token.setRefreshToken(refreshToken)

				// 保存用户ID
				storage.setItem('userId', userId)

				// 保存用户信息
				this.setUserInfo(userInfo)
				
				// 清除游客模式
				this.isGuestMode = false
				storage.setItem('isGuestMode', false)

				// 更新最后刷新时间
				this.lastRefreshTime = Date.now()
				
				// 发送登录成功事件，通知页面刷新数据
				uni.$emit('loginStateChanged', { isLogin: true })
				
				// 确保立即获取完整的用户信息
				this.getUserInfo(true).catch(error => {
					console.error('登录后获取用户信息失败:', error)
				})
			}
		},

		// 获取用户信息
		async getUserInfo(forceRefresh = false) {
			// 如果是游客模式，直接返回游客信息
			if (this.isGuestMode) {
				return this.userInfo
			}
			
			// 如果已经有用户信息且不需要强制刷新，且刷新时间在5分钟内，则直接返回缓存数据
			const now = Date.now()
			const refreshInterval = 5 * 60 * 1000 // 5分钟刷新一次

			if (this.userInfo && !forceRefresh && (now - this.lastRefreshTime < refreshInterval)) {
				return this.userInfo
			}

			try {
				const res = await api.user.getUserInfo()
				this.setUserInfo(res.data)
				this.lastRefreshTime = now
				return res.data
			} catch (error) {
				// 如果获取失败但本地有缓存，返回缓存数据
				if (this.userInfo) {
					return this.userInfo
				}
				throw error
			}
		},

		// 获取Token使用情况
		async getTokenUsage() {
			if (this.isGuestMode) {
				// 为游客返回默认值
				return {
					dailyUsed: 0,
					limit: 2000, // 游客模式限制更低
					isDefault: true
				}
			}
			
			if (!this.isLogin) return null

			try {
				const res = await api.user.getDailyTokenUsage()
				this.tokenUsage = res.data
				return res.data
			} catch (error) {
				console.error('获取Token使用情况失败:', error)
				return null
			}
		},

		// 更新用户信息
		async updateUserInfo(data) {
			if (this.isGuestMode) {
				message.error('游客模式不支持此操作，请先登录')
				return Promise.reject(new Error('游客模式不支持此操作'))
			}
			
			try {
				const res = await api.user.updateUserInfo(data)
				await this.getUserInfo(true) // 强制刷新用户信息
				message.success('更新成功')
				return res
			} catch (error) {
				message.error('更新失败: ' + error.message)
				throw error
			}
		},

		// 更新昵称和头像
		async updateNicknameAndAvatar(nickname, avatar) {
			if (this.isGuestMode) {
				message.error('游客模式不支持此操作，请先登录')
				return Promise.reject(new Error('游客模式不支持此操作'))
			}
			
			try {
				const res = await api.user.updateNicknameAndAvatar(nickname, avatar)
				await this.getUserInfo(true) // 强制刷新用户信息
				message.success('更新成功')
				return res
			} catch (error) {
				message.error('更新失败: ' + error.message)
				throw error
			}
		},

		// 退出登录
		async logout() {
			try {
				if (this.isLogin) {
					await api.auth.logout()
					message.success('退出登录成功')
				}
			} catch (error) {
				console.error('登出请求失败:', error)
			} finally {
				// 无论请求成功与否，都清除本地登录状态
				token.removeToken()
				token.removeRefreshToken()
				this.setUserInfo(null)
				this.vipInfo = null
				this.tokenUsage = null
				
				// 设置为游客模式
				this.setGuestMode()

				// 清除其他登录相关的存储
				storage.removeItem('lastLoginTime')
			}
		},

		// 检查登录状态
		checkLoginStatus() {
			const tokenValue = token.getToken()
			const userInfo = storage.getItem('userInfo')
			const isGuestMode = storage.getItem('isGuestMode')
			
			if (isGuestMode) {
				this.setGuestMode()
				return true
			}

			if (tokenValue && userInfo) {
				this.setUserInfo(userInfo)
				return true
			}
			
			// 如果没有登录状态，默认设为游客模式
			this.setGuestMode()
			return false
		},

		// 获取VIP信息
		async getVipInfo() {
			if (this.isGuestMode) return null
			if (!this.isLogin) return null

			try {
				const res = await api.user.getVipInfo()
				this.vipInfo = res.data
				return res.data
			} catch (error) {
				console.error('获取VIP信息失败:', error)
				return null
			}
		},

		// 刷新令牌
		async refreshToken() {
			if (this.isGuestMode) return false
			
			try {
				const refreshTokenValue = token.getRefreshToken()
				if (!refreshTokenValue) {
					throw new Error('刷新令牌不存在')
				}

				console.log('尝试刷新令牌:', refreshTokenValue)

				const res = await api.auth.refreshToken({
					refreshToken: refreshTokenValue
				})

				console.log('刷新令牌响应:', res)

				if (res.data) {
					const {
						token: newToken,
						refreshToken: newRefreshToken
					} = res.data

					// 保存新令牌
					token.setToken(newToken)
					token.setRefreshToken(newRefreshToken)

					return true
				}

				return false
			} catch (error) {
				console.error('刷新令牌失败:', error)
				// 刷新失败，设置为游客模式
				this.setGuestMode()
				return false
			}
		},

		// 发送验证码
		async sendCode(phoneNumber) {
			try {
				const res = await api.auth.sendCode({
					phoneNumber
				})
				return res
			} catch (error) {
				message.error('发送验证码失败: ' + error.message)
				throw error
			}
		}
	}
})